package com.appspot.bs24event.controller.admin.event;

import java.text.SimpleDateFormat;

import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import org.slim3.controller.validator.Validators;
import org.slim3.util.BeanUtil;
import org.slim3.util.RequestMap;

import com.appspot.bs24event.common.Constants;
import com.appspot.bs24event.meta.EventMeta;
import com.appspot.bs24event.service.EventService;

/**
 * CreateCompleteControllerクラス。
 * @version $Id: CreateCompleteController.java 100 2011-06-17 03:14:57Z bs24event@gmail.com $
 */
public class CreateCompleteController extends Controller {

    /** ログ */
    protected static final Logger logger = Logger.getLogger(CreateCompleteController.class.getName());

    private EventMeta meta = EventMeta.get();

    private EventService service = new EventService();

    @Override
    protected Navigation setUp() {
        logger.info(this.getClass().getName() + " start.");
        return super.setUp();
    }

    @Override
    protected void tearDown() {
        logger.info(this.getClass().getName() + " end.");
        super.tearDown();
    }

    @Override
    public Navigation run() throws Exception {
        // トークンチェック
        HttpSession session = request.getSession();
        String token = request.getParameter(Constants.TOKEN_KEY);
        if ( token == null || ! token.equals(session.getAttribute(Constants.TOKEN_KEY)) ) {
            logger.info("トークンエラー");
            return forward("/common/warn.jsp");
        }
        session.removeAttribute(Constants.TOKEN_KEY);

        // 入力項目の取得
        RequestMap requestMap = new RequestMap(request);
        if (logger.isDebugEnabled()) logger.debug("requestMap = "+requestMap);
        BeanUtil.copy(requestMap, meta);

        // 入力チェック
        Validators v = new Validators(request);
        if ( ! validate(v)) {
            request.setAttribute("ERROR", v.getErrors());
            return forward("/admin/event/create");
        }

        // 開催日のデータ変換
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        requestMap.put("eventDate", sdf.parse((String)requestMap.get("eventDate")));

        // イベントの登録
        service.insert(requestMap);

        // イベント作成完了画面へ遷移
        return forward("createComplete.jsp");
    }

    /**
     * 入力チェック。
     * @return
     */
    protected boolean validate(Validators v) {
        // 日時
        v.add(meta.eventDate, v.required(), v.dateType("yyyy/mm/dd"));
        v.add(meta.eventStartHour, v.required(), v.regexp("[0-9]+"));
        v.add(meta.eventStartMin, v.required(), v.regexp("[0-9]+"));
        v.add(meta.eventEndHour, v.required(), v.regexp("[0-9]+"));
        v.add(meta.eventEndMin, v.required(), v.regexp("[0-9]+"));
        // タイトル
        v.add(meta.title, v.required(), v.maxlength(60));
        // お店
        v.add(meta.place, v.maxlength(60));
        // 会費
        v.add(meta.fee, v.maxlength(20));
        // 予約名
        v.add(meta.reservedName, v.maxlength(40));
        // 備考
        v.add(meta.note, v.maxlength(500));
        // 場所(住所)
        v.add(meta.address, v.maxlength(100));
        return v.validate();
    }
}
